<!doctype html>
<html lang="en-us">
<head>
	<meta name="generator" content="Hugo 0.63.2" />

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>刹宕博客 | 人如秋鸿来有信，事若春梦了无痕</title>
    <meta property="og:title" content="刹宕博客 | 人如秋鸿来有信，事若春梦了无痕">
    <meta property="og:type" content="website">
    <meta name="Keywords" content="java,系统架构,shutdown,孟江莱">
    <meta name="description" content="Java">
    <meta property="og:url" content="http://www.shutdown.cn/">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">

    <link rel="stylesheet" href='/css/normalize.css'>
    <link rel="stylesheet" href='/css/style.css'>
    <link rel="alternate" type="application/rss+xml+xml" href="http://www.shutdown.cn/index.xml" title="刹宕博客" />
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

    


    
    
</head>


<body>
    <header id="header" class="clearfix">
    <div class="container">
        <div class="col-group">
            <div class="site-name ">
                
                    <h1>
                        <a id="logo" href="http://www.shutdown.cn">
                            刹宕博客
                        </a>
                    </h1>
                
                <p class="description">人如秋鸿来有信，事若春梦了无痕</p>
            </div>
            <div>
                <nav id="nav-menu" class="clearfix">
                    <a class="current" href="http://www.shutdown.cn">首页</a>
                    
                    <a  href="http://www.shutdown.cn/tools/" title="工具">工具</a>
                    
                    <a  href="http://www.shutdown.cn/archives/" title="归档">归档</a>
                    
                    <a  href="http://www.shutdown.cn/about/" title="关于">关于</a>
                    
                </nav>
            </div>
        </div>
    </div>
</header>

    <div id="body">
        <div class="container">
            <div class="col-group">

                <div class="col-8" id="main">
                    
<div class="res-cons">
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/linux%E4%B8%8B%E4%BF%AE%E6%94%B9%E6%96%87%E4%BB%B6%E6%89%80%E5%B1%9E%E7%94%A8%E6%88%B7%E7%BB%84%E5%92%8C%E4%BF%AE%E6%94%B9%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90%E7%9A%84%E6%96%B9%E6%B3%95/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            linux下修改文件所属用户组和修改文件权限的方法
 修改文件所属用户组的命令是chown，这个命令的格式是   chown [-R] username filename chown [-R] username:group filename
 第一个是修改文件所属的的用户，第二个修改文件所属用户组,-R属性为可选属性，意思是递归修改，也就是把文件下所有文件，包括子目录一起修改，大多数情况下-R 属性都是这个意思。
2.修改文件权限的命令是chmod，这个命令的格式是有两种设置方法有数字法与文字法i，数字法
就是用数字来代替rwx，r、w、x分别对应4、2、1，这个命令的格式为
 chmod [-R] xyz filename
 其中x代表owner权限，y代表group权限，z代表others权限，以上三种身份的值就是rwx的和，r代表读，w写 ，x运行，如果没有相应的权限则值为0。 如想设置.bashrc文件的权限为owner为rwx，group权限为无，others权限为无，则命令如下
 chmod 700 .bashrc
 ……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/linux%E4%B8%8B%E4%BF%AE%E6%94%B9%E6%96%87%E4%BB%B6%E6%89%80%E5%B1%9E%E7%94%A8%E6%88%B7%E7%BB%84%E5%92%8C%E4%BF%AE%E6%94%B9%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90%E7%9A%84%E6%96%B9%E6%B3%95/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/linux%E6%9F%A5%E6%89%BE%E5%A4%A7%E6%96%87%E4%BB%B6/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            在Windows系统中，我们可以使用TreeSize工具查找一些大文件或文件夹，非常的方便高效，在Linux系统中，如何去搜索一些比较大的文件呢？下面我整理了一下在Linux系统中如何查找大文件或文件夹的方法。
1： 如何查找大文件？
其实很多时候，你需要了解当前系统下有哪些大文件，比如文件大小超过100M或1G（阀值视具体情况而定）。那么如何把这些大文件搜索出来呢？例如我要搜索当前目录下，超过800M大小的文件
[root@getlnx01 u03]# pwd /u03 [root@getlnx01 u03]# find . -type f -size +800M ./flash_recovery_area/backup/backupsets/ora_df873519197_s46815_s1 ./flash_recovery_area/backup/backupsets/ora_df873523646_s46822_s1 ./flash_recovery_area/backup/backupsets/ora_df873521714_s46818_s1 ./flash_recovery_area/backup/backupsets/ora_df873522876_s46820_s1 ./flash_recovery_area/backup/backupsets/ora_df873517396_s46813_s1 ./flash_recovery_area/backup/backupsets/ora_df873523321_s46821_s1 ./flash_recovery_area/backup/backupsets/ora_df873515765_s46811_s1 ./flash_recovery_area/backup/backupsets/ora_df873520789_s46817_s1 ./flash_recovery_area/backup/backupsets/ora_df873524162_s46823_s1 ./flash_recovery_area/backup/backupsets/ora_df873518302_s46814_s1 ./flash_recovery_area/backup/backupsets/ora_df873519953_s46816_s1 ./flash_recovery_area/backup/backupsets/ora_df873516500_s46812_s1 ./flash_recovery_area/backup/backupsets/ora_df873513413_s46809_s1 ./flash_recovery_area/backup/backupsets/ora_df873514789_s46810_s1 ./oradata/epps/invsubmat_d08.dbf ./oradata/epps/gmtinv_d08.dbf ./oradata/epps/gmtinv_x01.dbf ./oradata/epps/undotbs02.dbf ./oradata/epps/gmtinv_d07.dbf ./oradata/epps/undotbs01.dbf ./oradata/epps/gmtinv_x02.dbf 
如上命令所示，我们仅仅能看到超过800M大小的文件的文件名称，但是对文件的信息（例如，文件大小、文件属性）一无所知，那么能否更详细显示一些文件属性或信息呢，当然可以，如下所示
[root@getlnx01 u03]# find . -type f -size +800M -print0 | xargs -0 ls -l -rw-r----- 1 oracle oinstall 2782846976 Mar 6 11:51 ./flash_recovery_area/backup/backupsets/ora_df873513413_s46809_s1 -rw-r----- 1 oracle oinstall 1878433792 Mar 6 11:53 ./flash_recovery_area/backup/backupsets/ora_df873514789_s46810_s1 -rw-r----- 1 oracle oinstall 1378492416 Mar 6 11:54 ./flash_recovery_area/backup/backupsets/ora_df873515765_s46811_s1 -rw-r----- 1 oracle oinstall 1641381888 Mar 6 11:56 ./flash_recovery_area/backup/backupsets/ora_df873516500_s46812_s1 -rw-r----- 1 oracle oinstall 1564065792 Mar 6 11:58 ./flash_recovery_area/backup/backupsets/ora_df873517396_s46813_s1 -rw-r----- 1 oracle oinstall 1663492096 Mar 6 12:00 ./flash_recovery_area/backup/backupsets/ora_df873518302_s46814_s1 -rw-r----- 1 oracle oinstall 1368244224 Mar 6 12:02 ./flash_recovery_area/backup/backupsets/ora_df873519197_s46815_s1 -rw-r----- 1 oracle oinstall 1629069312 Mar 6 12:04 ./flash_recovery_area/backup/backupsets/ora_df873519953_s46816_s1 -rw-r----- 1 oracle oinstall 1629954048 Mar 6 12:06 ./flash_recovery_area/backup/backupsets/ora_df873520789_s46817_s1 -rw-r----- 1 oracle oinstall 1202192384 Mar 6 12:07 .……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/linux%E6%9F%A5%E6%89%BE%E5%A4%A7%E6%96%87%E4%BB%B6/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/Mac-VMWARE%E5%AE%89%E8%A3%85REDIS/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            Mac VMWARE 安装redis 虚拟机安装CENTOS的步骤略过。
1.配置网络 # 关闭防火强 systemctl stop firewalld # 安装 epel yum install epel-release # 安装常用工具 yum install wget net-tools telnet tree nmap sysstat lrzsz dos2unix bind-utils nc -y # 修改网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 ifcfg-ens33配置文件内容如下
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=2d30e58d-0954-4959-b44f-04c0c0beac65 DEVICE=ens33 ONBOOT=yes # GATEWAY和IPADDR自己设置就可以，格式正常就行 GATEWAY=10.4.7.1 IPADDR=10.4.7.189 NETMASK=255.255.252.0 # DNS要设置的与网络中的DNS的一致 DNS1=10.2.3.20 查看DNS方式
2.安装GCC sudo yum group install &quot;Development Tools&quot; 3.下载redis编译 1 2 3 4 5 6 7 8 9 10 11  mkdir -p /usr/redis cd /usr/redis wget http://download.redis.io/releases/redis-3.2.9.tar.gz tar -vxzf redis-3.2.9.tar.gz ln -s redis-3.2.9 redis cd redis # 直接make会报错误， zmalloc.h:50:31: 致命错误：jemalloc/jemalloc.h：没有那个文件或目录 # 加 MALLOC=libc 参数可以正常编译 make MALLOC=libc # 将运行文件安装到 /usr/local/bin 下，可以在任意目录下执行redis命令 make install   安装好以后，可以测试启动redis服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26  [root@localhost redis]# redis-server 33024:C 23 Sep 10:45:37.……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/Mac-VMWARE%E5%AE%89%E8%A3%85REDIS/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/MAC-VSCODE%E9%85%8D%E7%BD%AEC%E8%AF%AD%E8%A8%80%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            MAC VSCODE配置C语言开发环境   安装VS Code
  打开VSCode 按快捷键shift+command+X,并在搜索框输入c/c++, 安装C/C++组件
  在Finder中创建空文件夹并在VS Code中打开, 并File =&gt; Save workspace As 将工作区间另存为
  新建Hello.c文件并保存
  接下来需要配置3个JSON文件c_cpp_properties.json、tasks.json、launch.json
  c_cpp_properties.json : 使用快捷键command+shift+p打开命令行面板（Command Palette）
输入edit configurations,在弹出的列表中选择带JSON的C/C++:Edit Configurations(JSON)
此时会自动新增.vscode文件夹，并新建c_cpp_properties.json文件
  配置字段 includePath
1 2 3 4 5 6 7 8  &#34;includePath&#34;: [ &#34;${workspaceFolder}/**&#34;, &#34;/Library/Developer/CommandLineTools/usr/include/c++/v1&#34;, &#34;/usr/local/include&#34;, &#34;/Library/Developer/CommandLineTools/usr/lib/clang/10.0.1/include&#34;, &#34;/Library/Developer/CommandLineTools/usr/include&#34; ],   你可能需要注意 &quot;/Library/Developer/CommandLineTools/usr/lib/clang/10.0.1/include&quot;,中的版本号，可以进入Finder,按快捷键command+shift+G输入
/Library/Developer/CommandLineTools/usr/lib/clang/ 以此来查看版本号  tasks.json : 在打开.c文件的情况下（比如我这里的hello.c）打开命令行面板command+shift+P,输入tasks:configure task,选择Tasks:Configure Task
点击C/C++:gcc build active file
  ​	自动生成tasks.json文件并打开
这里我们需要配置args字段
1 2 3 4 5 6  &#34;args&#34;: [ &#34;-g&#34;,//编译命令  &#34;${workspaceFolder}/hello.c&#34;,//当前workspace下的hello.c文件  &#34;-o&#34;,//输出文件命令  &#34;${workspaceFolder}/hello.o&#34;//生成的可执行文件的路径及名称  ],   launch.json :   打开命令行面板command+shift+P,输入launch,选择Open launch.json 选择环境为C++(GDB/LLDB) 自动生成launch.json文件并打开  配置 program字段
这个字段是要运行的文件路径，写你生成的可执行文件的路径即可，比如我这里是
1  &#34;program&#34;: &#34;${workspaceFolder}/hello.o&#34;,    Shift + Command + B 构建
  F5 调试
  ……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/MAC-VSCODE%E9%85%8D%E7%BD%AEC%E8%AF%AD%E8%A8%80%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/Mac%E4%BD%BF%E7%94%A8Docker%E6%90%AD%E5%BB%BApython%E6%B5%8B%E8%AF%95%E6%89%A7%E8%A1%8C%E7%8E%AF%E5%A2%83/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            Mac使用Docker搭建python测试执行环境 首先拉取 python的镜像
1  docker pull python:3.5   新建一个文件目录/VscodePythonProjects，并创建python测试文件pyth.py
1 2  #!/usr/bin/python print(&#34;Hello, World!&#34;);   使用docker run 执行python文件
1 2  ~% docker run --rm -v /VscodePythonProjects:/usr/src/file -w /usr/src/file python:3.5 python pyth.py Hello, World!   参数说明：
--rm 执行完后删除容器，避免残留过多容器 -v 将主机的py文件目录挂载到容器中的/usr/src/file -w 指定容器的/usr/src/file目录为工作目录 python:3.5 指定镜像 在~/.ssh目录里，增加 py文件，内容如下：
#!/bin/bash echo `docker run --rm -v /VscodePythonProjects:/usr/src/file -w /usr/src/file python:3.5 python $1` 这样在任意的目录里直接执行py命令了
1 2  ~% py pyth.py Hello, World!   当然，在mac系统上面直接安装python也能实现相同的效果。但是如果不想污染系统，也能进行Python测试的话，这种也是一种方式。
上述的方式，只能执行没有依赖的python代码，但是比如说我要运行引入了redis模块的代码，就会报redis模块不存在的问题，这种情况，我们就需要在docker的容器中安装 redis模块了。
1 2  ~% docker run --name &#34;python3.5&#34; -it -v /VscodePythonProjects:/usr/src/file -w /usr/src/file python:3.5 /bin/bash root@2870e7cf8e74:/usr/src/file#   执行上面命令将进入 创建的python容器的命令行。然后执行命令安装redis模块，使用国内镜像可以更快执行
root@2870e7cf8e74:/usr/src/file# pip install redis -i https://pypi.tuna.tsinghua.edu.cn/simple DEPRECATION: Python 3.5 reached the end of its life on September 13th, 2020. Please upgrade your Python as Python 3.5 is no longer maintained. pip 21.0 will drop support for Python 3.5 in January 2021. pip 21.0 will remove support for this functionality.……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/Mac%E4%BD%BF%E7%94%A8Docker%E6%90%AD%E5%BB%BApython%E6%B5%8B%E8%AF%95%E6%89%A7%E8%A1%8C%E7%8E%AF%E5%A2%83/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/PowerMockit%E6%B5%8B%E8%AF%95%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            1. 概述 长期以来，借助 Mocking框架进行单元测试一直被认为是一种有用的实践，尤其是Mockito框架在近年来占据了主导地位。
并且为了促进体面的代码设计并使公共 API 变得简单，一些需要的特性被有意地遗漏了。然而，在某些情况下，这些缺点迫使测试人员编写繁琐的代码只是为了使模拟的创建可行。
这就是PowerMock框架发挥作用的地方。
PowerMockito是 PowerMock 的扩展 API，用于支持 Mockito。它以一种简单的方式提供了使用 Java 反射 API 的功能，以克服 Mockito 的问题，例如缺乏模拟final、静态或私有方法的能力。
本文将介绍 PowerMockito API 及其在测试中的应用。
2.准备 为 Mockito 集成 PowerMock 支持的第一步是在 Maven POM 文件中包含以下两个依赖项：
1 2 3 4 5 6 7 8 9 10 11 12 13  &lt;dependency&gt; &lt;groupId&gt;org.powermock&lt;/groupId&gt; &lt;artifactId&gt;powermock-module-junit4&lt;/artifactId&gt; &lt;version&gt;1.6.4&lt;/version&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.powermock&lt;/groupId&gt; &lt;artifactId&gt;powermock-api-mockito&lt;/artifactId&gt; &lt;version&gt;1.6.4&lt;/version&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;/dependency&gt; 复制代码   接下来，我们需要通过应用以下两个注释来准备使用PowerMockito的测试用例：
1 2 3  @RunWith(PowerMockRunner.class) @PrepareForTest(fullyQualifiedNames = &#34;com.baeldung.powermockito.introduction.*&#34;) 复制代码   @PrepareForTest注释中的fullyQualifiedNames元素表示我们想要模拟的类型的完全限定名称数组。在这种情况下，我们使用带有通配符的包名称来告诉PowerMockito准备com.baeldung.powermockito.introduction包中的所有类型以进行mock。
3. 模拟构造函数和最终方法 在本节中，我们将演示在使用new运算符实例化类时获取模拟实例而不是真实实例的方法，然后使用该对象模拟最终方法。协作类的构造函数和最终方法将被模拟，定义如下：
1 2 3 4 5 6  public class CollaboratorWithFinalMethods { public final String helloMethod() { return &#34;Hello World!&#34;; } } 复制代码   首先，我们使用PowerMockito API创建一个模拟对象：
1 2  CollaboratorWithFinalMethods mock = mock(CollaboratorWithFinalMethods.class); 复制代码   接下来，设置一个期望值，告诉我们无论何时调用该类的无参数构造函数，都应该返回一个模拟实例而不是一个真实的实例：
1 2  whenNew(CollaboratorWithFinalMethods.class).withNoArguments().thenReturn(mock); 复制代码   让我们通过使用其默认构造函数实例化CollaboratorWithFinalMethods类来看看这个构造模拟是如何工作的，然后验证 PowerMock 的行为：
CollaboratorWithFinalMethods collaborator = new CollaboratorWithFinalMethods(); verifyNew(CollaboratorWithFinalMethods.class).withNoArguments(); 复制代码 在下一步中，将期望设置为最终方法：
1 2  when(collaborator.helloMethod()).thenReturn(&#34;Hello Baeldung!&#34;); 复制代码   然后执行此方法：……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/PowerMockit%E6%B5%8B%E8%AF%95%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/python%E6%89%A7%E8%A1%8Crequest%E8%AF%B7%E6%B1%82/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            python执行request请求 需要批量执行需要登录的网站的某个http接口，自己写了python脚本去进行执行。要获取登录状态，可以使用谷歌浏览器F12打开开发者工具，在网络/network里面，在实际请求的地址上右键，然后Copy-&gt; Copy as cURL。
这时复制出来的curl地址是可以直接在terminal里面直接执行的，其中cookie等记录登录状态信息的都有。
curl 'http://www.shutdown.cn/manage/quartz/resume.do?name=10.111.222.33&amp;group=server-10.111.222.33' \ -H 'Connection: keep-alive' \ -H 'Pragma: no-cache' \ -H 'Cache-Control: no-cache' \ -H 'Upgrade-Insecure-Requests: 1' \ -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36' \ -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \ -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8' \ -H 'Cookie: route=7736bbdcb5ae01803cccfe9aa7852299; JSESSIONID=83B9C240FA66B95AFC4152EBFB15FDBB; ' \ --compressed \ --insecure 通过工具网站 https://curlconverter.com/#python 可以将curl地址转换成Python的request请求语句。
import requests cookies = { 'route': '7736bbdcb5ae01803cccfe9aa7852299', 'JSESSIONID': '83B9C240FA66B95AFC4152EBFB15FDBB', } headers = { 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', } params = ( ('name', '10.111.222.33'), ('group', 'server-10.111.222.33'), ) response = requests.get('http://www.shutdown.cn/manage/quartz/resume.do', headers=headers, params=params, cookies=cookies, verify=False) 这个语句直接复制到 python里面，处理成批量格式，然后直接执行就可以了……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/python%E6%89%A7%E8%A1%8Crequest%E8%AF%B7%E6%B1%82/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/Redis-BigKey/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            一、什么是bigkey 在Redis中，一个字符串最大512MB，一个二级数据结构（例如hash、list、set、zset）可以存储大约40亿个(2^32-1)个元素，但实际上中如果下面两种情况，我就会认为它是bigkey。
 字符串类型：它的big体现在单个value值很大，一般认为超过10KB就是bigkey。 非字符串类型：哈希、列表、集合、有序集合，它们的big体现在元素个数太多。  二、危害 bigkey可以说就是Redis的老鼠屎，具体表现在：
1.内存空间不均匀 这样会不利于集群对内存的统一管理，存在丢失数据的隐患。
2.超时阻塞 由于Redis单线程的特性，操作bigkey的通常比较耗时，也就意味着阻塞Redis可能性越大，这样会造成客户端阻塞或者引起故障切换，它们通常出现在慢查询中。
例如，在Redis发现了这样的key，你就等着DBA找你吧。
1 2 3 4  127.0.0.1:6379&gt; hlen big:hash(integer) 2000000127.0.0.1:6379&gt; hgetall big:hash 1) &#34;a&#34; 2) &#34;1&#34;   3.网络拥塞 bigkey也就意味着每次获取要产生的网络流量较大，假设一个bigkey为1MB，客户端每秒访问量为1000，那么每秒产生1000MB的流量，对于普通的千兆网卡(按照字节算是128MB/s)的服务器来说简直是灭顶之灾，而且一般服务器会采用单机多实例的方式来部署，也就是说一个bigkey可能会对其他实例造成影响，其后果不堪设想。
4.过期删除 有个bigkey，它安分守己（只执行简单的命令，例如hget、lpop、zscore等），但它设置了过期时间，当它过期后，会被删除，如果没有使用Redis 4.0的过期异步删除(lazyfree-lazy-expire yes)，就会存在阻塞Redis的可能性，而且这个过期删除不会从主节点的慢查询发现（因为这个删除不是客户端产生的，是内部循环事件，可以从latency命令中获取或者从slave节点慢查询发现）。
5.迁移困难 当需要对bigkey进行迁移（例如Redis cluster的迁移slot），实际上是通过migrate命令来完成的，migrate实际上是通过dump + restore + del三个命令组合成原子命令完成，如果是bigkey，可能会使迁移失败，而且较慢的migrate会阻塞Redis。
三、怎么产生的？ 一般来说，bigkey的产生都是由于程序设计不当，或者对于数据规模预料不清楚造成的，来看几个：
(1) 社交类：粉丝列表，如果某些明星或者大v不精心设计下，必是bigkey。
(2) 统计类：例如按天存储某项功能或者网站的用户集合，除非没几个人用，否则必是bigkey。
(3) 缓存类：将数据从数据库load出来序列化放到Redis里，这个方式非常常用，但有两个地方需要注意:
 第一，是不是有必要把所有字段都缓存 第二，有没有相关关联的数据  例如遇到过一个例子，该同学将某明星一个专辑下所有视频信息都缓存一个巨大的json中，造成这个json达到6MB，后来这个明星发了一个官宣
四、如何发现 1. redis-cli &ndash;bigkeys redis-cli提供了&ndash;bigkeys来查找bigkey，例如下面就是一次执行结果：
1 2 3 4 5 6 7 8 9 10 11  -------- summary ------- Biggest string found &#39;user:1&#39; has 5 bytes Biggest list found &#39;taskflow:175448&#39; has 97478 items Biggest set found &#39;redisServerSelect:set:11597&#39; has 49 members Biggest hash found &#39;loginUser:t:20180905&#39; has 863 fields Biggest zset found &#39;hotkey:scan:instance:zset&#39; has 3431 members 40 strings with 200 bytes (00.00% of keys, avg size 5.00) 2747619 lists with 14680289 items (99.86% of keys, avg size 5.34) 2855 sets with 10305 members (00.10% of keys, avg size 3.……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/Redis-BigKey/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/Redis-Sentinel/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            port 26380 daemonize yes logfile &quot;26380.log&quot; dir &quot;/usr/redis-sentinel&quot; dbfilename &quot;dump-26380.rdb&quot; sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 ……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/Redis-Sentinel/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/Redis-%E6%9C%80%E5%A4%A7%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%BF%9E%E6%8E%A5%E6%95%B0/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            1. 前言 上一篇文章《你的Redis集群撑得住吗？》讲了应用增加pod时，有一个应用最大连接数计算公式为:maxTotal * pod数 &lt; Redis cluster的最大连接数(单个分片的max_clients * 分片数) * 80% （预留百分比），大家有没有考虑过以下两个问题:1.Redis max_clients 是怎么设置的？2.为什么Redis cluster的最大连接数是 : 单个分片的max_clients * 分片数? 不急，看完这篇文章，你心中就会有答案了。
2. Redis 最大客户端连接数介绍 在Redis 2.4中，对可以同时处理的最大客户端数量有一个硬编码的限制。
在Redis 2.6中，此限制是动态的：默认情况下，它设置为10000个客户端，当然，你可以在redis.conf中通过max_clients进行定制化设置。
但是，Redis会与内核一起检查我们能够打开的最大文件描述符数量（检查soft limits）。如果该限制小于我们要处理的最大客户端数量再加上32（即Redis保留供内部使用的文件描述符数量），则Redis会修改最大客户端数量以匹配我们的客户端数量是真正能够处理在当前操作系统的限制。
1 2  $ ./redis-server --maxclients 100000 [41422] 23 Jan 11:28:33.179 # Unable to set the max number of files limit to 100032 (Invalid argument), setting the max clients configuration to 10112.   当配置Redis以处理特定数量的客户端时，最好确保也相应地设置了操作系统对每个进程的最大文件描述符数量的限制。
在Linux下，可以使用以下命令在当前会话和系统范围内设置这些限制：
1 2  ulimit -Sn 100000 # This will only work if hard limit is big enough. sysctl -w fs.file-max=100000   Redis 4.0.12 源码在下面这一段也有明确说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22  /* Try to check if the OS is capable of supporting so many FDs. */ server.maxclients = ll; if (ll &gt; orig_value) { adjustOpenFilesLimit(); if (server.maxclients !……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/Redis-%E6%9C%80%E5%A4%A7%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%BF%9E%E6%8E%A5%E6%95%B0/">阅读全文</a></p>
    </article>
    
    



<ol class="page-navigator">
    
    <li class="prev">
        <a href="http://www.shutdown.cn/page/2/">上一页</a>
    </li>
    

    
    <li >
        <a href="http://www.shutdown.cn/">1</a>
    </li>
    
    <li >
        <a href="http://www.shutdown.cn/page/2/">2</a>
    </li>
    
    <li  class="current">
        <a href="http://www.shutdown.cn/page/3/">3</a>
    </li>
    
    <li >
        <a href="http://www.shutdown.cn/page/4/">4</a>
    </li>
    
    <li >
        <a href="http://www.shutdown.cn/page/5/">5</a>
    </li>
    

    
    <li class="next">
        <a href="http://www.shutdown.cn/page/4/">下一页</a>
    </li>
    
</ol>



</div>

                </div>

                <div id="secondary">
    <section class="widget">
        <form id="search" action='http://www.shutdown.cn/search/' method="get" accept-charset="utf-8" target="_blank" _lpchecked="1">
      
      <input type="text" name="q" maxlength="20" placeholder="Search">
      <input type="hidden" name="sitesearch" value="http://www.shutdown.cn">
      <button type="submit" class="submit icon-search"></button>
</form>
    </section>
    
    <section class="widget">
        <h3 class="widget-title">最近文章</h3>
<ul class="widget-list">
    
    <li>
        <a href="http://www.shutdown.cn/post/lvs_keepalive_jenkins2_ha/" title="lvs&#43;keepalive配置Jenkins2高可用 ">lvs&#43;keepalive配置Jenkins2高可用 </a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/markdown/" title="markdown语法">markdown语法</a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/first/" title="hello world">hello world</a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/apt-get-update%E5%87%BA%E7%8E%B0NO_PUBKEY%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/" title=""></a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/BigKey/" title=""></a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/bigkey%E5%88%A0%E9%99%A4%E9%97%AE%E9%A2%98/" title=""></a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/cachecloud%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/" title=""></a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/copy-on-write/" title=""></a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/Cpu%E6%8C%96%E7%9F%BFRedis%E7%AB%9F%E6%98%AF%E5%86%85%E9%AC%BC/" title=""></a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/docker-%E5%90%AF%E5%8A%A8-zookeeper/" title=""></a>
    </li>
    
</ul>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">分类</h3>
<ul class="widget-list">
    
    <li><a href="http://www.shutdown.cn/categories/cicd/">cicd (1)</a></li>
    
    <li><a href="http://www.shutdown.cn/categories/%E5%88%86%E7%B1%BB/">分类 (2)</a></li>
    
</ul>
    </section>

    <section class="widget">
        <h3 class="widget-title">标签</h3>
<div class="tagcloud">
    
</div>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">其它</h3>
        <ul class="widget-list">
            <li><a href="http://www.shutdown.cn/index.xml">文章 RSS</a></li>
        </ul>
    </section>
</div>
            </div>
        </div>
    </div>
    <footer id="footer">
    <div class="container">
        &copy; 2013-2022版权所有：<a href="http://www.beian.miit.gov.cn">京ICP备13019191号-1</a> <a href="http://www.shutdown.cn">刹宕博客 By 孟江莱</a>.
        Powered by <a rel="nofollow noreferer noopener" href="https://gohugo.io" target="_blank">Hugo</a>.
        <a href="https://www.flysnow.org/" target="_blank">Theme</a> based on <a href="https://github.com/flysnow-org/maupassant-hugo" target="_blank">maupassant</a>.
    </div>
</footer>



<a id="rocket" href="#top"></a>
<script type="text/javascript" src='/js/totop.js?v=0.0.0' async=""></script>






</body>

</html>